<?php
/**
 * Smart Library - Smart Framework
 * http://smart-framework.highet.eu
 *
 * @category   SmartL
 * @package    SmartL_Doctrine
 * @subpackage Template
 * @copyright  Copyright (c) 2005-2008 Smart Framework team - Stepan Sindelar, Vojtech Vit
 * @license    http://www.opensource.org/licenses/bsd-license.php	New BSD License
 */

/**
 * @see Doctrine_Template
 */
require_once ('Doctrine/Template.php');
/**
 * @see SmartL_Doctrine_Template_I18n_Translation
 */
require_once ('SmartL/Doctrine/Template/I18n/Translation.php');

/**
 * @see SmartL_Application
 */
require_once ('SmartL/Application.php');

/**
 * Template for models internationalisation.
 * 
 * @uses SmartL_Doctrine_Template_I18n_Translation
 * 
 * @package SmartL_Doctrine
 * @subpackage Template
 */
class SmartL_Doctrine_Template_I18n extends Doctrine_Template {
	/**
	 * __construct
	 *
	 * @param string $array 
	 * @return void
	 */
	public function __construct(array $options = array()) {
		$this->_plugin = new SmartL_Doctrine_Template_I18n_Translation ( $options );
	}
	/**
	 * setUp
	 *
	 * @return void
	 */
	public function setUp() {
		// Nastaví sloupce a vztahy dle šablony lokalizace
		$this->_plugin->initialize ( $this->_table );
	}
	
	/**
	 * getI18n
	 *
	 * @return void
	 */
	public function getI18n() {
		return $this->_plugin;
	}
	
	/**
	 * Returns requested column translation (defaultly in actual language
	 * and culture).
	 *
	 * @param string $columnName Column name
	 * @param string $languageId Language ISO code
	 * @return string|null Best found translation or null.
	 * 
	 * @todo 5 : (S) NENÍ doděláno. Je to stále ještě příliš málo chytrá metoda..:-)
	 */
	public function translate($columnName, $languageId = null, $app = null) {
		$record = $this->getInvoker ();
		if (isset ( $languageId )) {
			return $record->Translation [$languageId]->$columnName;
		}
		// 1. podívá se na $culture. Pokud je null, nastaví se aktuální jazyk aplikace
		// (jazyk aplikace může být nastaven přímým výběrem uživatele, jeho prohlížečem
		// či defaultním nastavením aplikace).
		// Poznámka: Pokud existuje lokalizace pro nějakou kulturu jazyka, MUSÍ 
		// existovat lokalizace pro výchozí kulturu jazyka.
		// 2. Ověří se, zda je požadovaná $languageId vůbec podporovaný jazyk. Pokud ne, přeskočí
		// se na krok 4
		// 3. V poli $this->Translations[] se zkusí najít jazyk kultury $languageId (např.
		// "cs-CZ"). Pokud není nalezen nebo region není specifikován, zkusí se vyhledat
		// defaultní region jazyka.
		// 4. Pokud není nic nalezeno, zkusí se podívat na defaultLanguageId (pokud je
		// staženo z db) a vybrat jeho překlad
		// 5. Pokud stále není nic nalezeno, projde všechny načtené překlady a dosadí první,
		// který najde
		// 6. Pokud není načten žádný překlad, vrátí VÝJIMKU "Překlad nenalezen"
		if ($app === null) {
			$app = SmartL_Application::getInstance ();
		}
		foreach ( $app->getLanguages () as $lang ) {
			//language je tedka typu SmartL_Application_LanguageInfo
			// a metoda $language->getId() vrati ISO identifikator jazyka napr. en-GB
			// dale by se mohla pouzit i metoda $language->equals($ident), ktera to porovna s ISO i Zend idckama
			if (isset ( $record->Translation [$lang->getId ()]->$columnName ) and $record->Translation [$lang->getId ()]->$columnName != null) {
				return $record->Translation [$lang->getId ()]->$columnName;
			}
		}
		return null;
	}
}
